package com.generics;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;

public class Generics01 {
    public static void main(String[] args) {
        String a = "123";
        String b = "123";
        System.out.println(a == b);
        Person<String> person = new Person<String>("Adair");
        person.show();
        //1.给泛型指向的数据类型是，要求是引用类型，不能是基本数据类型
        Person<Integer> person1 = new Person<Integer>(19);
        person1.show();

        //2.在给泛型指定类型后，可以传入该类型的子类型
        Person<A> person2 = new Person<A>(new A());
        Person<A> person3 = new Person<A>(new B());

        //3.简写形式
        //编译器会进行类型推断
        Person<A> person4 = new Person<>(new A());
        Person<A> person5 = new Person<>(new B());

        //4. 如果是这样写，泛型默认是 Object
        ArrayList<Object> list = new ArrayList<>();
        LinkedList<Object> linkedList = new LinkedList<>();
        HashMap<Object, Object> hashMap = new HashMap<>();
    }
}

class A {

}

class B extends A {

}

class Person<E> {
    //E表示 s的数据类型，该数据类型在定义Person对象的时候指定
    //在编译期间，就确定E是什么类型
    E s;

    //E也可以是参数类型
    public Person(E s) {
        this.s = s;
    }

    //返回类型也可以是E
    public E f() {
        return s;
    }

    public void show() {
        //显示s的运行类型
        System.out.println(s.getClass() + "  " + s);
    }
}